#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <assert.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/dir.h>
#include <sys/stat.h>

#include "bstrlib.h"
#include "server.h"
#include "common.h"
#include "receive.h"
#include "send_file_listing.h"
#include "send_metadata.h"
#include "send_slice.h"

void send_metadata(fd_list list, int i){
    struct stat *file_prop = NULL;
    char *str_aux = NULL, *msg = NULL, *dir = NULL;
    int fd_client=0;

    fd_client = fd_list_get_fd(list, i);
    /*Recuperamos el nombre del archivo de la estructura*/
    str_aux = fd_list_get_filename(list, i);
    file_prop = calloc(1, sizeof(struct stat));
    if (file_prop == NULL){
        perror("calloc-file_prop");
        send_msg(fd_client, MSG199);
        free(str_aux);
        str_aux = NULL;
        close(fd_client);
        fd_list_remove(list, i);
        return;
    }
    msg = calloc(40,sizeof(char *));
    if (msg == NULL){
        perror("calloc-msg");
        free(file_prop);
        file_prop = NULL;
        send_msg(fd_client, MSG199);
        free(str_aux);
        str_aux = NULL;
        close(fd_client);
        fd_list_remove(list, i);
        return;
    }
    dir = calloc(strlen(FOLDER)+strlen(str_aux)+2,sizeof(char *));
    if (dir == NULL){
        perror("calloc-dir");
        free(file_prop);
        file_prop = NULL;
        free(msg);
        msg = NULL;
        send_msg(fd_client, MSG199);
        free(str_aux);
        str_aux = NULL;
        close(fd_client);
        fd_list_remove(list, i);
        return;
    }

    /*Guardamos el path y nombre del archivo pedido.
    No pude usar strncpy :-( */
    strcpy(dir, FOLDER);
    strncat(dir, str_aux, strlen(str_aux));
    if (stat (dir, file_prop) < 0){
        perror("stat");
        if (errno == 29){
            send_msg(fd_client, MSG202);
        }
    }
    else{
        /*OK al cliente*/
        send_msg(fd_client, MSG0);
        /*Ponemos el tamaño en la variable msg y se lo mandamos al cliente*/
        sprintf(msg, "%lu",file_prop->st_size);
        strncat(msg, "\r\n", 2);
        send_msg(fd_client, msg);

    }
    fd_list_set_finish(list, i, true);
    /*Liberamos todo*/
    free(file_prop);
    file_prop = NULL;
    free(dir);
    dir = NULL;
    free(msg);
    msg = NULL;
    free(str_aux);
    str_aux = NULL;
    return;
}
